Obsidian TC 日別リスト 3
検索ボックスを追加
日付を降順で表示
https://scrapbox.io/files/6704c200d73993001c1fa08f.png
code:js
`dataviewjs
// 時間と分のフォーマット関数
function formatTime(minutes) {
let hours = Math.floor(minutes / 60);
let remainingMinutes = minutes % 60;
if (hours > 0) {
return ${hours}h${remainingMinutes}m;
} else {
return ${remainingMinutes}m;
}
}
// 曜日を日本語の一文字に変換する関数
function getJapaneseDayOfWeek(day) {
const daysInJapanese = {
"Sunday": "日",
"Monday": "月",
"Tuesday": "火",
"Wednesday": "水",
"Thursday": "木",
"Friday": "金",
"Saturday": "土"
};
return daysInJapaneseday; }
// フィルターキーワードを取得するテキストボックスを作成
let filterInput = document.createElement('input');
filterInput.type = 'text';
filterInput.placeholder = 'フィルターキーワードを入力';
filterInput.style.marginBottom = '10px';
filterInput.style.width = '100%';
// "フィルタ" ボタンを作成
let filterButton = document.createElement('button');
filterButton.innerText = 'フィルタ';
filterButton.style.display = 'block';
filterButton.style.marginBottom = '20px';
// テキストボックスとボタンを最初に表示
dv.container.appendChild(filterInput);
dv.container.appendChild(filterButton);
// ボタンがクリックされたときのイベントリスナー
filterButton.addEventListener('click', async () => {
let filterKeyword = filterInput.value; // テキストボックスからキーワードを取得
let filterEnabled = filterKeyword.length > 0;
// 再検索の際に以前の結果をクリア
let existingTable = dv.container.querySelector('table');
if (existingTable) {
existingTable.remove(); // 前回のテーブルを削除
}
// 今日の日付を取得
let today = window.moment().startOf('day');
// 過去30日分の日付を取得
let startDate = today.clone().subtract(30, 'days');
// 日別タスクリストと実績時間を格納するオブジェクト
let tasksByDate = {};
// データビュープラグインを利用して過去30日分のタスクを取得
for (let i = 0; i <= 30; i++) {
let currentDate = startDate.clone().add(i, 'days');
let filePath = notes/${currentDate.format('YYYY-MM-DD')}.md; // デイリーノートのパス
let tasksForDay = [];
let totalMinutes = 0;
if (await app.vault.adapter.exists(filePath)) {
let fileContent = await dv.io.load(filePath);
let lines = fileContent.split('\n');
// 各行を確認して開始時刻、実績時間、タスクを抽出
lines.forEach(line => {
let match = line.match(/(\d{2}:\d{2})\s+(\d+)\s*\\\s*(.*)/); // 開始時刻、実績時間、タスク内容を正規表現で抽出
if (match) {
let startTime = match1; // 開始時刻 let minutes = parseInt(match2, 10); // 実績時間を数値に変換 let task = match3; // タスク内容 // ()内を削除してリンク部分を省略
task = task.replace(/\[(^\]+)\]\(^\)+\)/g, "$1"); // フィルター条件に一致するタスクのみ表示
if (!filterEnabled || task.includes(filterKeyword)) {
tasksForDay.push(${startTime} ${task} (${formatTime(minutes)}));
totalMinutes += minutes; // 実績時間を足し合わせる
}
}
});
// 日付ごとのタスクリストと実績時間の合計を保存
if (tasksForDay.length > 0) {
let dayOfWeek = getJapaneseDayOfWeek(currentDate.format('dddd')); // 曜日を取得して日本語の一文字に変換
dayOfWeek: dayOfWeek,
tasks: tasksForDay,
total: totalMinutes
};
}
}
}
// 日付を降順で並び替え
let sortedDates = Object.keys(tasksByDate).sort((a, b) => new Date(b) - new Date(a));
// テーブルのHTMLを生成
let tableHTML = `
<table border="1" style="width: 100%; text-align: left;">
<tr>
<th style="width: 150px;">日付 (曜日)</th>
<th>タスクリスト</th>
<th style="width: 100px;">実績</th>
</tr>
`;
// 降順で日ごとのタスクと実績時間をテーブルに表示
sortedDates.forEach(date => {
let data = tasksByDatedate; tableHTML += `
<tr>
<td>${date} (${data.dayOfWeek})</td>
<td style="font-size: 12px;">${data.tasks.join('<br>')}</td>
<td style="text-align: right;">${formatTime(data.total)}</td>
</tr>
`;
});
tableHTML += </table>;
// 再検索時に再度ボタンとテキストボックスを表示しつつ、結果を表示
dv.container.appendChild(document.createElement('div')).innerHTML = tableHTML;
});
`